package thread.atomic;

import java.util.concurrent.atomic.AtomicInteger;

/**Java.util.concurrent中提供了atomic原子包，可以实现原子操作（atomic operation），
 * 即在多线程环境中，执行的操作不会被其他线程打断。
 *
 * 在Atomic包里一共有12个类，四种原子更新方式，
 * 分别是原子更新基本类型，原子更新数组，原子更新引用和原子更新字段。Atomic包里的类基本都是使用Unsafe实现的包装类。
 *
 *
 int addAndGet(int delta) ：以原子方式将输入的数值与实例中的值（AtomicInteger里的value）相加，并返回结果
 boolean compareAndSet(int expect, int update) ：如果输入的数值等于预期值，则以原子方式将该值设置为输入的值。
 int getAndIncrement()：以原子方式将当前值加1，注意：这里返回的是自增前的值。
 void lazySet(int newValue)：最终会设置成newValue，使用lazySet设置值后，可能导致其他线程在之后的一小段时间内还是可以读到旧的值。
    关于该方法的更多信息可以参考并发网翻译的一篇文章《AtomicLong.lazySet是如何工作的？》
 int getAndSet(int newValue)：以原子方式设置为newValue的值，并返回旧值。

 demo示例:

 */
public class AtomicDemo extends  Thread{
    private static final AtomicInteger atomicI = new AtomicInteger();
    private static  final Integer[] originalI={0};

    @Override
    public void run() {
        atomicI.incrementAndGet();
        originalI[0]++;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        for(int j=0;j<10;j++){
            for (int i = 0; i < 1000; i++) {
                AtomicDemo demo = new AtomicDemo();
                demo.start();
                try {
                    demo.join();
                }
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

        System.out.println("最终结果 atomicI："+atomicI);
        System.out.println("最终结果 originalI："+originalI[0]);//有可能不是10000
    }
}
